Sinea a onstepdata v detailu

Otázka od: Roman

27. 11. 2002 22:00

Zdravim.
Mam dve memory tabulky, master a detail. Jejich obsah pak chci rucne predat
do sestavy pomoci OnGetData, OnStepData. V detailu sestavy se mi vsak tiskne
porad pouze prvni zaznam. Pokud pripojim k TSestDetail primo DataSource, tak
je vse v poradku.

Obsluha OnGet a OnStep vypada takto:
procedure TFormSest.SestDetGetData(Sender: TSestavaD);
with Sender do
  begin
    for i:=0 to MemDet.Fields.Count-1 do
      ObsahyPolozek.Add(MemDet.Fields[i].asString);
  end;

function TFormSest.SestDetStepData(Sender: TSestavaD;
Result:=srOK;
  case Dir of
    sdFirst:begin MemDet.First;Result:=srBof;end;
    sdPrior:begin MemDet.Prior; if MemDet.BOF then Result:=srBof;end;
    sdNext :begin MemDet.Next; if MemDet.EOF then Result:=srEof;end;
    sdLast :begin MemDet.Last;Result:=srEof;end;
  end;

V cem je problem?

Dik,
Roman
D4, Sinea x.39z

Odpovedá: Vaclav Krmela

28. 11. 2002 0:49

> From: Roman
>
> Mam dve memory tabulky, master a detail. Jejich obsah pak
> chci rucne predat
> do sestavy pomoci OnGetData, OnStepData. V detailu sestavy se
> mi vsak tiskne
> porad pouze prvni zaznam. Pokud pripojim k TSestDetail primo
> DataSource, tak je vse v poradku.
>
> Obsluha OnGet a OnStep vypada takto:

Obsluhu OnGet a OnStep je potreba napsat pro obe tabulky.
Vazbu Master/detail mezi tabulkami je ale nutne
zajistit mimo generator sestav.

Vaclav Krmela

Odpovedá: Roman

28. 11. 2002 8:07

> > From: Roman
> >
> > Mam dve memory tabulky, master a detail. Jejich obsah pak
> > chci rucne predat
> > do sestavy pomoci OnGetData, OnStepData. V detailu sestavy se
> > mi vsak tiskne
> > porad pouze prvni zaznam. Pokud pripojim k TSestDetail primo
> > DataSource, tak je vse v poradku.
> >
> > Obsluha OnGet a OnStep vypada takto:
>
> Obsluhu OnGet a OnStep je potreba napsat pro obe tabulky.
> Vazbu Master/detail mezi tabulkami je ale nutne
> zajistit mimo generator sestav.

No ano, OnGet a OnStep nad Master tabulkou (v TSestava) funguje dobre (proto
jsem ty funkce neuvadel, jsou analogicke s temi, ktere jsem tu posilal, jen
pro jinou tabulku). Vazba mezi tabulkami je zajistena mimo generator
(Detail.MasterSource -> Master.DataSource,
Detail.MasterFields=Master.DetailFields).
Jak jsem psal, pokud pripojim k SestDet primo Datasource te detail tabulky,
tak je to v poradku (i kdyz TSestava plnim pomoci OnGet a OnStep), pokud tam
ty zaznamy plnim rucne, tak nejsem schopny prejit na dalsi zaznam. Tabulky
jsou tkbmMemTable.

Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Vaclav Krmela

28. 11. 2002 7:56

> From: Roman
>
> > > V detailu sestavy se mi vsak tiskne
> > > porad pouze prvni zaznam. Pokud pripojim k TSestDetail primo
> > > DataSource, tak je vse v poradku.

Z te detail tabulky se tiskne prvni zaznam spravneho detailu,
nebo detail odpovidajici prvnimu master zaznamu?


> Vazba mezi tabulkami je zajistena mimo generator
> (Detail.MasterSource -> Master.DataSource,
> Detail.MasterFields=Master.DetailFields).

Kdyz jsou to tabulky s pripojenym DataSource,
tak pro nepouzijes ten DataSource?
Proc si pridelavas praci s GetData, StepData?

Vaclav Krmela

Odpovedá: Roman

28. 11. 2002 8:19

> > > > V detailu sestavy se mi vsak tiskne
> > > > porad pouze prvni zaznam. Pokud pripojim k TSestDetail primo
> > > > DataSource, tak je vse v poradku.
>
> Z te detail tabulky se tiskne prvni zaznam spravneho detailu,
> nebo detail odpovidajici prvnimu master zaznamu?

No, takhle: u kazdeho masteru se vytiskne spravny pocet detailu, jenom
hodnoty jsou porad z prvniho zaznamu. Ted se na to nemuzu podivat, ale
myslim, ze je to prvni zaznam spravneho detailu.

> > Vazba mezi tabulkami je zajistena mimo generator
> > (Detail.MasterSource -> Master.DataSource,
> > Detail.MasterFields=Master.DetailFields).
>
> Kdyz jsou to tabulky s pripojenym DataSource,
> tak pro nepouzijes ten DataSource?
> Proc si pridelavas praci s GetData, StepData?

Protoze tam potrebuju pridavat jeste nejake polozky navic, ktere v tech
tabulkach nejsou a nechci je tam zbytecne pridavat. A ten Datasource tam
normalne byt nema, ten tam je ted jen na zkousku.

Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Vaclav Krmela

28. 11. 2002 12:57

> From: Roman
> >
> > Kdyz jsou to tabulky s pripojenym DataSource,
> > tak pro nepouzijes ten DataSource?
> > Proc si pridelavas praci s GetData, StepData?
>
> Protoze tam potrebuju pridavat jeste nejake polozky navic,
> ktere v tech
> tabulkach nejsou a nechci je tam zbytecne pridavat.

Pokud je to memory tabulka, tak nejaka polozka navic
preci nevadi.
Lze pouzit i dalsi moznosti, napriklad CalculatedField.
Nebo vyuzit jine moznosti Siney, napr. predani pres parametr
nebo pres vypocitavanou uzivatelskou funkci.

 
> A ten Datasource tam
> normalne byt nema, ten tam je ted jen na zkousku.

Kdyz uz tam je tabulka, tak proc tam nemuze byt
i TDataSource? Zabyvat se vlastnim obsluhovanim
GetData, StepData ma smysl tehdy,
pokud data nejsou v zadne tabulce.

Vaclav Krmela

Odpovedá: Roman

28. 11. 2002 13:15

> Pokud je to memory tabulka, tak nejaka polozka navic
> preci nevadi.
> Lze pouzit i dalsi moznosti, napriklad CalculatedField.
> Nebo vyuzit jine moznosti Siney, napr. predani pres parametr
> nebo pres vypocitavanou uzivatelskou funkci.

To je obecne reseni. Nejaky dotaz podle vysledku vytvori Fields v MemTable a
naplni ji. Pak se z tech dat vytvari sestava (anebo neco jineho). Takze ted
bych musel vytvorit nove Fields a projit celou tabulku a naplnit je,
vytisknout sestavu, zrusit nove fields. Proc mam plnit memory tabulku necim,
co potrebuju jenom pri tisku?

> > A ten Datasource tam
> > normalne byt nema, ten tam je ted jen na zkousku.
>
> Kdyz uz tam je tabulka, tak proc tam nemuze byt
> i TDataSource? Zabyvat se vlastnim obsluhovanim
> GetData, StepData ma smysl tehdy,
> pokud data nejsou v zadne tabulce.

Pridat kod do GetData a StepData je mnohem jednodussi, nez to co jsem popsal
vyse.

Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Roman

29. 11. 2002 13:03

> Pokud je to memory tabulka, tak nejaka polozka navic
> preci nevadi.
> Lze pouzit i dalsi moznosti, napriklad CalculatedField.
> Nebo vyuzit jine moznosti Siney, napr. predani pres parametr
> nebo pres vypocitavanou uzivatelskou funkci.

Sice nevim proc je takovy problem nepouzit Datasource, ale:.
Jeste bych navazal na vcerejsi debatu: zkusil jsem plnit data v TSestDet
takto:
for i:=0 to MemDet.Fields.Count-1 do
  ObsahyPolozek.Add(IntToStr(Random(10000)));
Obsah OnStepData jsem nechal takovy, jaky jsem psal drive.

Vysledek je, ze pocet radku v jednotlivych Detailech je spravny (takovy,
jaky je pocet v detail tabulce). Akorat hodnoty vsech radku jsou stejne (tj.
hodnoty prvniho radku detailu jsou nahodna cisla, ostatni radky obsahuji
tytez hodnoty), predpokladam, ze neni mozne, aby se vice jak 100x nahodne
vybrala ta sama cisla... zajimalo by me tedy, jak funguje plneni dat v
OnGetData v TSestDet?

Dik,
Roman
==============================
http://kouzelne.misto.cz

Odpovedá: Vaclav Krmela

29. 11. 2002 19:40

> From: Roman
>
>
> Sice nevim proc je takovy problem nepouzit Datasource, ale:.

Nikdo netvrdi, ze je problem nepouzit Datasource.
Ja jsem psal pouze to, ze pouzit Datasource je bezpracne,
protoze si pres Datasource generator sestav sam vytahne
ta data ktera potrebuje.

Pokud se DataSource nepouzije, musi se o vse postarat
programator sam.


> zkusil jsem plnit data v TSestDet takto:
> for i:=0 to MemDet.Fields.Count-1 do
> ObsahyPolozek.Add(IntToStr(Random(10000)));
> Obsah OnStepData jsem nechal takovy, jaky jsem psal drive.
>
> Vysledek je, ze pocet radku v jednotlivych Detailech je
> spravny (takovy, jaky je pocet v detail tabulce).

O pocet radku se nestara GetData, ale StepData.

> Akorat hodnoty vsech radku
> jsou stejne (tj. hodnoty prvniho radku detailu jsou nahodna cisla,
> ostatni radky obsahuji tytez hodnoty),

No to je preci zrejme, pokud pro plneni dat pouzijes
  ObsahyPolozek.Add...
ObsahyPolozek jsou typu TStrings. Pomoci Add se nova data
pridavaji az na konec za stara, takze je zrejme,
ze se na tistenych radcich opakuji stale stejna data.
Pred plnenim dalsich radku je nutne predchozi obsah vymazat:
  ObsahyPolozek.Clear

Vaclav Krmela